#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

// 工具类
class Util
{
public:
    static int ReadLine(int sock, std::string &out)
    {
        char ch = 'X';
        while (ch != '\n')
        {
            //从缓冲区读取一个字符
            ssize_t s = recv(sock, &ch, 1, 0);
            if (s > 0)
            {
                if (ch == '\r') 
                { 
                    //不同http版本可能会以不同的标记符作为结果：如\r\n 或 \r 或者\n
                    //所以在这个地方需要向后进行窥探，判断下一个字符是否为\n
                    recv(sock, &ch, 1, MSG_PEEK);
                    if (ch == '\n')
                    {
                        // 窥探成功，这个字符一定存在
                        recv(sock, &ch, 1, 0);
                    }
                    else
                    {
                        ch = '\n';
                    }
                }
                // 1. 普通字符
                // 2. \n
                out.push_back(ch);  //输入到out中的字符统一以\n作为结尾。
            }
            else if (s == 0) //对端关闭连接，我也关闭
            {
                return 0;
            }
            else
            {
                return -1;
            }
        }
        return out.size();
    }

    //将target字符串以sep为分隔符分成两部分，放到sub1_out和sub2_out中
    static bool CutString(const std::string &target, std::string &sub1_out, std::string &sub2_out, std::string sep)
    {
        size_t pos = target.find(sep);
        if (pos != std::string::npos)
        {
            sub1_out = target.substr(0, pos);
            sub2_out = target.substr(pos + sep.size());
            return true;
        }
        return false;
    }
};
